﻿using NUnit.Framework;
using System.Collections.Generic;

namespace Spellchecker.Test
{

    [TestFixture]
    public class TestCleaningUnit
    {
        [Test]
        public void zwei_Worte_getrennt_mit_Satzzeichen()
        {
            var result = SpellingController.CleanText("Hallo,:,Stefan");
            Assert.That(result, Is.EqualTo("Hallo   Stefan"));
        }

        [Test]
        public void zwei_Worte_getrennt_mit_Satzzeichen_und_Whitespace()
        {
            var result = SpellingController.CleanText("Hallo,:\nStefan");
            Assert.That(result, Is.EqualTo("Hallo   Stefan"));
        }


        [Test]
        public void zwei_Worte_getrennt_mit_Satzzeichen_am_Anfang_und_Whitespace()
        {
            var result = SpellingController.CleanText(" ,, Hallo,:\nStefan");
            Assert.That(result, Is.EqualTo("    Hallo   Stefan"));
        }

    }


    [TestFixture]
    public class TestSplittingUnit
    {
        [Test]
        public void zwei_Worte_getrennt_mit_Leerzeichen()
        {
            IEnumerable<string> result = SpellingController.SplitIntoWord("xyz   abc");
            Assert.That(result, Is.EqualTo(new []{"xyz","abc"}));
        }

        [Test]
        public void zwei_Worte_mit_Leerzeichen_am_Anfang_und_getrennt_mit_Leerzeichen()
        {
            IEnumerable<string> result = SpellingController.SplitIntoWord("   xyz   abc");
            Assert.That(result, Is.EqualTo(new[] { "xyz", "abc" }));
        }

    }


    [TestFixture]
    public class TestCheckWordUnit
    {
        [Test]
        public void Komplett_Test()
        {
            Dictionary<string, bool> wortVerzeichnis = new Dictionary<string, bool>();
            wortVerzeichnis.Add("Hallo",false);
            wortVerzeichnis.Add("Stefan",false);
            wortVerzeichnis.Add("München",false);

            var result = SpellingController.CheckWords(new[] {"Hallo", "Stuttgart"}, wortVerzeichnis);
            Assert.That(result, Is.False);
        }
    }


    [TestFixture]
    public class TestLodadUnit
    {
        [Test]
        public void tja_jetzt_schlägt_Stefan_den_Gong()
        {
            Assert.That(true, Is.True);
        }
    }


    [TestFixture]
    public class TestSpellingController
    {
        [Test]
        public void TestHSE_EinEnthaltenesWort()
        {
            bool result = SpellingController.HasSpellingErrors("Hallo");
            Assert.That(result, Is.False);
        }

        [Test]
        public void TestHSE_EinEnthaltenesWortGrossKleinSchreibungUnterschiedlichZuWortverzeichnis()
        {
            bool result = SpellingController.HasSpellingErrors("hAllo");
            Assert.That(result, Is.False);
        }

        [Test]
        public void TestHSE_ZweiEnthalteneWorteMitWhiteSpace1()
        {
            var result = SpellingController.HasSpellingErrors("Hallo Stefan");
            Assert.That(result, Is.False);
        }


        [Test]
        public void TestHSE_ZweiEnthalteneWorteMitWhiteSpace2()
        {
            var result = SpellingController.HasSpellingErrors("Hallo Ralf");
            Assert.That(result, Is.True);
        }

        [Test]
        public void TestHSE_ZweiWorteMitEinemSatzzeichen()
        {
            var result = SpellingController.HasSpellingErrors("Hallo!Stefan");
            Assert.That(result, Is.False);
        }

        [Test]
        public void TestHSE_ZweiEnthalteneWorteWerdenZusammenGefuegtGeltenAlsEinWortUndSindDamitFalsch()
        {
            var result = SpellingController.HasSpellingErrors("HalloStefan");
            Assert.That(result, Is.False);
        }

        [Test]
        public void TestHSE_ZweiEnthalteneWorteMitSatzzeichen()
        {
            var result = SpellingController.HasSpellingErrors("  \tHallo,: Stefan");
            Assert.That(result, Is.False);
        }

        [Test]
        public void TestHSE_ZweiWorteEinsIstEnthaltenEinsNichtMitSatzzeichen()
        {
            var result = SpellingController.HasSpellingErrors("  \tHallo,: Ralf");
            Assert.That(result, Is.True);
        }

        [Test]
        public void TestHSE_NurAlleErlaubtenSatzzeichenUndWhiteSpace()
        {
            var result = SpellingController.HasSpellingErrors(".,;!?:'\n\t \r");
            Assert.That(result, Is.False);
        }


        [Test]
        public void TestHSE_LeererString()
        {
            var result = SpellingController.HasSpellingErrors("");
            Assert.That(result, Is.False);
        }

    }

    [TestFixture]
    public class TestDictExpander
    {
        [Test]
        public void ein_Wort_mit_Flexionen_fuehrt_zu_einen_Dictionary_mit_einem_Eintrag_pro_Flexion()
        {
            Dictionary<string, bool> wortverzeichnis = new Dictionary<string, bool>();
            wortverzeichnis.Add("ihr,~e,~er,~es,~en,~em", true);

            Assert.That(SpellingController.ExpandDict(wortverzeichnis).Count, Is.EqualTo(6));
        }

        [Test]
        public void Pro_Feld_nur_eine_Tilde()
        {
            Dictionary<string, bool> wortverzeichnis = new Dictionary<string, bool>();
            wortverzeichnis.Add("ihr,~e,~er,~es,~en,~em", true);

            Assert.That(SpellingController.ExpandDict(wortverzeichnis).ContainsKey("ihre"), Is.True);
        }

        [Test]
        public void Pro_Feld_zwei_Tilden()
        {
            Dictionary<string, bool> wortverzeichnis = new Dictionary<string, bool>();
            wortverzeichnis.Add("Haus,~es,Meister~,~~", true);

            Assert.That(SpellingController.ExpandDict(wortverzeichnis).ContainsKey("HausHaus"), Is.True);

        }
    }
}
